package Servlet;

import Service.EmailService;
import Service.UserService;
import org.json.JSONException;
import org.json.JSONObject;
import utils.DBUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;

/**
 * @Author Su
 * @Date 2025/4/30 17:39
 * @Version 1.0 （版本号）
 */
@WebServlet("/api/auth/forgot-password")
public class ForgotPasswordServlet extends HttpServlet {

    // 声明服务类实例
    private EmailService emailService;
    private UserService userService;

    @Override
    public void init() throws ServletException {
        try {
            Connection connection = DBUtil.getConnection();
            // 初始化邮件服务和用户服务
            this.emailService = new EmailService(connection);
            this.userService = new UserService(connection);
        } catch (SQLException e) {
            throw new ServletException("初始化失败", e);
        }
    }

    // 处理POST请求的方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("application/json");
        resp.setCharacterEncoding("UTF-8");

        // 创建响应JSON对象
        JSONObject responseJson = new JSONObject();

        try {
            // 1、解析请求体
            JSONObject requestJson = parseRequestBody(req);
            System.out.println(requestJson);// 打印请求数据(调试用)

            // 从JSON中提取邮箱和操作类型 register reset forget
            String email = requestJson.getString("email");
            String type = requestJson.getString("type");
            // 2、判断邮箱是否存在
            boolean result = userService.isEmailRegistered(email);
            System.out.println("判断邮箱是否存在：" + result);
            if(!result){
                responseJson.put("code", 400);
                responseJson.put("message", "邮箱有误");
                return;
            }
            // 3、生成并发送验证码
            Map<String, Object> map = emailService.codeGenAndSend(email, type);
            // 将服务层返回的结果放入响应
            responseJson.put("code",map.get("code"));
            responseJson.put("message",map.get("message"));
        }  catch (JSONException e) {
            // JSON解析异常处理
            responseJson.put("code", 400);
            responseJson.put("message", "请求参数错误");
            resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        } catch (SQLException e) {
            responseJson.put("code", 500);
            responseJson.put("message", "系统错误");
            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            e.printStackTrace();
        } finally {
            resp.getWriter().print(responseJson.toString());
        }
    }

    // 我定义的辅助方法，上面有调用：
    // 解析HTTP请求体的辅助方法，
    // 它将请求中的JSON数据转换为JSONObject对象 jsonobject，来自org，json库，处理json数据的类
    private JSONObject parseRequestBody(HttpServletRequest req) throws IOException, JSONException {
        StringBuilder sb = new StringBuilder();//创建StringBuilder，用于高效拼接请求体内容
        //JSONObject：返回类型，表示返回一个JSON对象
        //HttpServletRequest req：参数，接收HTTP请求对象
        //throws IOException, JSONException：声明可能抛出的异常

        try (BufferedReader reader = req.getReader()) {
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line); // 逐行读取请求体 将每行内容追加到StringBuilder中
            }
        }
        return new JSONObject(sb.toString());// 转换为JSON对象
    }
}
//邮件发送耗时，可改为异步处理